const db = require('../db/index.js')
// 导入bcrypt加密中间件
const bcrypt = require('bcryptjs')
//导入node.js的crypto生成uuid（唯一标识）
const crypto = require('crypto')
//导入fs用于处理文件
const fs = require('fs')
//上传头像接口
exports.uploadAvatar = (req, res) => {
	// res.send(req.files[0])  返回上传图片信息
	// 1.生成olnyId随机ID,文件与用户对应
	const onlyId = crypto.randomUUID()
	//保存上传文件时随机生成的文件名filename，后期处理路径
	let oldName = req.files[0].filename;
	//在服务器中的文件名  originalname原生名字   toString('utf8')防止乱码，使用utf8编码
	let newName = Buffer.from(req.files[0].originalname, 'latin1').toString('utf8')
	//文件在服务器的名字进行更换
	fs.renameSync('./public/upload/' + oldName, './public/upload/' + newName)
	//sql语句
	const sql = 'insert into image set ?'
	db.query(sql, {
		image_url: `http://127.0.0.1:3007/upload/${newName}`,
		onlyId
	}, (err, result) => {
		if (err) return res.cc(err)
		res.send({
			onlyId,
			status: 0,
			url: 'http://127.0.0.1:3007/upload/' + newName
		})
	})
}

// 绑定账号接口 onlyid account url   修改两个数据包，image | users 
//image插入account   users插入image_url数据
exports.bindAccount = (req, res) => {
	const {
		account,
		onlyId,
		url
	} = req.body
	const sql = 'update image set account = ? where onlyId = ?'
	db.query(sql, [account, onlyId], (err, result) => {
		if (err) return res.cc(err)
		if (result.affectedRows == 1) {
			const sql1 = 'update users set image_url = ? where account = ?'
			db.query(sql1, [url, account], (err, result) => {
				if (err) return res.cc(err)
				res.send({
					status: 0,
					message: '修改成功'
				})
			})
		}
	})
}
// 获取用户信息接口 接收参数 id
exports.getUserInfo = (req, res) => {
	//根据id查询数据库users表所有信息
	const sql = 'select * from users where id = ?'
	db.query(sql, req.body.id, (err, result) => {
		if (err) return res.cc(err)
		result[0].password = ''  //返回空密码，这样安全，不能返回密码
		// res.send(result[0])
		//成功，返回所有信息

		res.send(result)
	})
}
// 4.修改姓名 接收参数 id name
exports.changeName = (req, res) => {
	const {
		id,
		name
	} = req.body
	//根据id去users表更改name
	const sql = 'update users set name = ? where id = ?'
	db.query(sql, [name, id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '修改成功'
		})
	})
}
//5.修改性别接口
exports.changeSex = (req, res) => {
	const {
		id,
		sex
	} = req.body
	//注意 参数 要与sql语句位置对应[sex,id],不能写乱了
	const sql = 'update users set sex = ? where id = ?'
	db.query(sql, [sex, id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '修改成功'
		})
	})

}
// 6.修改邮箱接口 接收参数 id email
exports.changeEmail = (req, res) => {
	const {
		id,
		email
	} = req.body
	const sql = 'update users set email = ? where id = ?'
	db.query(sql, [email, id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '修改成功'
		})
	})
}
// 7. 修改用户密码接口
// 先输入旧密码 oldPassword 新密码 newPassword id 
exports.changePassword = (req, res) => {
	//通过id寻找旧密码
	const sql = 'select password from users where id = ?'
	db.query(sql, req.body.id, (err, result) => {
		if (err) return res.cc(err)
		// bcrypt
		//使用加密中间件的compareSync解密方法    hashSync加密方法
		//第一个参数req.body.oldPassword 前端传来的旧密码
		//第二个参数result[0].password 数据库查找到的密码  
		const compareResult = bcrypt.compareSync(req.body.oldPassword, result[0].password)
		//结果不相等
		if (!compareResult) {
			return res.send({
				status: 1,
				message: '原密码错误'
			})
		}
		//操作成功，把修改的新密码做加密
		req.body.newPassword = bcrypt.hashSync(req.body.newPassword, 10)
		//更新旧密码
		const sql1 = 'update users set password = ? where id = ?'
		db.query(sql1, [req.body.newPassword, req.body.id], (err, result) => {
			if (err) return res.cc(err)
			res.send({
				status: 0,
				message: '修改成功'
			})
		})
	})
}
//忘记密码-------------------------------------------------------------------------------------------
//密码，邮箱一致，则可以找回密码
//8.// 验证账户和与邮箱是否一致 email account 返回对应id
exports.verifyAccountAndEmail = (req, res) => {
	const {
		account,
		email
	} = req.body
	//根据账号找邮箱 返回对应ID
	const sql = 'select * from users where account = ?'
	db.query(sql, account, (err, result) => {
		if (err) return res.cc(err)
		// res.send(result[0].email)   返回数据库中的邮箱
		//对比数据库中的邮箱与前端传来的邮箱是否一直
		if (email == result[0].email) {
			res.send({
				status: 0,
				message: '查询成功',
				id: result[0].id  //返回个id，给修改密码用
			})
		} else {
			res.send({
				status: 1,
				message: '查询失败'
			})
		}
	})
}
// 9.登录页面修改密码 参数 newPassword id，在前端完成判断两次密码是否一致
exports.changePasswordInLogin = (req, res) => {
	// req.body.newPassword
	const user = req.body
	//对传来的密码进行加密
	user.newPassword = bcrypt.hashSync(user.newPassword, 10)
	const sql = 'update users set password = ? where id = ?'
	db.query(sql, [user.newPassword, user.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '更新密码成功'
		})
	})
}

// ---------------------------------------------------用户管理接口
//1.新增管理员
exports.createAdmin = (req, res) => {
	const {
		account,
		password,
		name,
		sex,
		department,
		email,
		identity
	} = req.body
	// 判断传来的账号是否存在与数据库中 
	const sql = 'select * from users where account = ?'
	db.query(sql, account, (err, results) => {
		//1.判断账号是否存在
		if (results.length > 0) {
			return res.send({
				status: 1,
				message: '账号已存在'
			})
		}
	})
	//不存在，插入
	const hashpassword = bcrypt.hashSync(password, 10)
	// 2.把账号跟密码插入到users表里面
	const sql1 = 'insert into users set ?'
	// 创建时间
	const create_time = new Date()
	db.query(sql1, {
		account,
		password: hashpassword,
		name,
		sex,
		department,
		email,
		// 身份
		identity,
		// 创建时间
		create_time,
		// 初始未冻结状态为0
		status: 0,
	}, (err, results) => {
		// 第一个,插入失败
		// affectedRows为影响的行数，如果插入失败，那么就没有影响到行数，也就是行数不为1
		if (results && results.affectedRows) {
			// 安全地读取 affectedRows  
			if (results.affectedRows !== 1) {
				return res.send({
					status: 1,
					message: '添加管理员失败'
				})
			}
		} else {
			// 处理错误或未定义的结果  
			console.error('查询结果未定义或查询未执行');
		}

		res.send({
			status: 0,
			message: '添加管理员成功'
		})
	})
}
// 获取管理员列表 参数是 identity 
exports.getAdminList = (req, res) => {
	const sql = 'select * from users where identity = ?'
	db.query(sql, req.body.identity, (err, result) => {
		if (err) return res.cc(err)
		result.forEach((e) => {
			e.password = ''
			e.create_time = ''
			e.image_url = ''
			e.status = ''
		})
		res.send(result)
	})
}
// 编辑管理员账号信息
exports.editAdmin = (req, res) => {
	const {
		id,
		name,
		sex,
		email,
		department
	} = req.body
	const date = new Date()
	const sql0 = 'select department from users where id = ?'
	db.query(sql0, id, (err, result) => {
		if (result[0].department == department) {
			// 修改的内容
			const updateContent = {
				id,
				name,
				sex,
				email,
				department,
				update_time: date,
			}
			const sql = 'update users set ? where id = ?'
			db.query(sql, [updateContent, updateContent.id], (err, result) => {
				if (err) return res.cc(err)
				res.send({
					status: 0,
					message: '修改管理员信息成功'
				})
			})
		} else {
			// 修改的内容
			const updateContent = {
				id,
				name,
				sex,
				email,
				department,
				update_time: date,
				read_list: null,
				read_status: 0
			}
			const sql = 'update users set ? where id = ?'
			db.query(sql, [updateContent, updateContent.id], (err, result) => {
				if (err) return res.cc(err)
				res.send({
					status: 0,
					message: '修改管理员信息成功'
				})
			})
		}
	})

}

// 对管理员取消赋权 参数 id
exports.changeIdentityToUser = (req, res) => {
	const identity = '用户'
	const sql = 'update users set identity = ? where id = ?'
	db.query(sql, [identity, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '降级成功'
		})
	})
}

// 对用户进行赋权 参数 id identity
exports.changeIdentityToAdmin = (req, res) => {
	const date = new Date()
	const sql = 'update users set identity = ?,update_time = ? where id = ?'
	db.query(sql, [req.body.identity, date, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '赋权成功'
		})
	})
}

// 通过账号对用户搜索 account identity
exports.searchUser = (req, res) => {
	const { account } = req.body
	const sql = 'select * from users where account = ?'
	db.query(sql, account, (err, result) => {
		if (err) return res.cc(err)
		result.forEach((e) => {
			e.password = ''
			e.create_time = ''
			e.image_url = ''
			e.status = ''
		})
		res.send(result)
	})
}

// 通过部门对用户搜索 department
exports.searchUserByDepartment = (req, res) => {
	const sql = 'select * from users where department = ? and identity = "用户"'
	db.query(sql, req.body.department, (err, result) => {
		if (err) return res.cc(err)
		result.forEach((e) => {
			e.password = ''
			e.image_url = ''
		})
		res.send(result)
	})
}


// 冻结用户 通过id 把status 置为 1 
exports.banUser = (req, res) => {
	const status = 1
	const sql = 'update users set status = ? where id = ?'
	db.query(sql, [status, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '冻结成功'
		})
	})
}



// 解冻用户
exports.hotUser = (req, res) => {
	const status = 0
	const sql = 'update users set status = ? where id = ?'
	db.query(sql, [status, req.body.id], (err, result) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '解冻成功'
		})
	})
}

// 获取冻结用户列表
exports.getBanList = (req, res) => {
	const sql = 'select * from users where status = "1" '
	db.query(sql, (err, result) => {
		if (err) return res.cc(err)
		res.send(result)
	})
}

// 删除用户 id account
exports.deleteUser = (req, res) => {
	const sql = 'delete from users where id = ?'
	db.query(sql, req.body.id, (err, result) => {
		if (err) return res.cc(err)
		const sql1 = 'delete from image where account = ?'
		db.query(sql1, req.body.account, (err, result) => {
			if (err) return res.cc(err)
			res.send({
				status: 0,
				message: '删除用户成功'
			})
		})
	})
}

// 获取对应身份的一个总人数 identity
exports.getAdminListLength = (req, res) => {
	const sql = 'select * from users where identity = ? '
	db.query(sql, req.body.identity, (err, result) => {
		if (err) return res.cc(err)
		res.send({
			length: result.length
		})
	})
}

// 监听换页返回数据 页码 pager identity
// limit 10 为我们要拿到数据 offset 我们跳过多少条数据
exports.returnListData = (req, res) => {
	// const number = (req.body.pager - 1) * 10
	const sql = `select * from users where identity = ? limit 8 offset ${req.body.pager} `
	db.query(sql, req.body.identity, (err, result) => {
		if (err) return res.cc(err)
		res.send(result)
	})

}